require "import"
import "android.app.*"
import "android.os.*"
import "android.widget.*"
import "android.view.*"
import "layout"
activity.setTitle("ZIP转MPKG工具")
activity.setTheme(android.R.style.Theme_Material_Light_NoActionBar)
activity.setContentView(loadlayout(layout))

import "java.io.FileInputStream"
import "java.io.FileOutputStream"
import "java.io.BufferedOutputStream"
import "java.io.ByteArrayOutputStream"
import "java.io.BufferedInputStream"

import "java.nio.ByteBuffer"
import "java.nio.ByteOrder"

import "java.util.zip.ZipFile"
import "java.util.zip.ZipInputStream"

-- ZIP文件路径和输出的MPKG文件路径
local zipPath = "/sdcard/kk.zip"--输入
local mpkgPath = "/sdcard/output.mpkg"--输出

-- 转换函数
function convertZipToMpkg()
    -- 打开ZIP文件
    local zf = ZipFile(zipPath)
    -- 获取ZIP注释作为版本号
    local ver = zf.getComment() or ""
    -- 获取文件数量
    local filenum = zf.size()
    -- 创建输出流
    local fos = FileOutputStream(mpkgPath)
    
    -- 写入整数辅助函数
    local function writeInt(i)
        local bytes = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(i).array()
        fos.write(bytes)
    end
    
    -- 写入数据辅助函数
    local function writeData(bytes)
        fos.write(bytes)
    end
    
    -- 写入字符串辅助函数
    local function writeStr(str)
        writeData(String(str).getBytes())
    end
    
    -- 写入版本信息
    writeInt(#ver)
    writeStr(ver)
    -- 写入文件数量
    writeInt(filenum)
    
    -- 用于存储所有文件数据的缓冲区
    local baos = ByteArrayOutputStream()
    local entries = zf.entries()
    local index = 0
    
    -- 遍历ZIP中的所有文件
    while entries.hasMoreElements() do
        local ze = entries.nextElement()
        local bis = BufferedInputStream(zf.getInputStream(ze))
        local length = bis.available()
        local name = ze.getName()
        
        -- 写入文件名信息
        writeInt(#name)
        writeStr(name)
        -- 写入文件索引
        writeInt(index)
        -- 写入文件长度
        writeInt(length)
        
        -- 更新索引位置
        index = index + length
        
        -- 读取文件内容并写入缓冲区
        local bytes = byte[length]
        bis.read(bytes)
        baos.write(bytes)
        bis.close()
    end
    
    -- 写入所有文件数据
    writeData(baos.toByteArray())
    
    -- 关闭所有流
    zf.close()
    fos.close()
    
    print("转换完成！ZIP已成功转换为MPKG")
    print("输出文件: "..mpkgPath)
end

-- 调用转换函数
convertZipToMpkg()